/*******************************************************************************
** 文件名称：gm_lunar.h
** 文件作用：农历操作
** 创建作者：Tom Free 付瑞彪
** 创建时间：2021-01-07
** 文件备注：农历相关操作
**
** 更新记录：
**          2021-01-07 -> 创建文件
**                                                          <Tom Free 付瑞彪>
**          2021-01-08 -> 添加公历转农历计算
**                                                          <Tom Free 付瑞彪>
**
**          Copyright (c) 2018-2020 付瑞彪 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/
#ifndef __GM_LUNAR_H__
#define __GM_LUNAR_H__

#include "gm_calendar.h"
#include "stdint.h"
#ifndef __cplusplus
#include "stdbool.h"
#endif

/* 定义使能农历 */
#ifndef GM_CALENDAR_CFG_LUNAR_ENABLE
#define GM_CALENDAR_CFG_LUNAR_ENABLE    1
#endif

/* 是否使能农历 */
#if (GM_CALENDAR_CFG_LUNAR_ENABLE > 0)

/* 农历日期 */
typedef struct _gm_lunar_t
{
    uint16_t year;      /* 年，范围请通过配置文件配置 */
    uint8_t  month;     /* 月，1-12，注意判断is_leap标志判断是否是闰月 */
    uint8_t  day;       /* 日，1-30，不同月份最大值不同 */
    bool     is_leap;   /* 此月是否是闰月 */
} gm_lunar_t;

#ifdef __cplusplus
extern "C" {
#endif

/*******************************************************************************
** 函数名称：gm_lunar_get_month_days
** 函数作用：获取当前月的总天数
** 输入参数：p_lunar - 农历日期
** 输出参数：天数
** 使用范例：uint8_t month_days = gm_lunar_get_month_days(&lunar);
** 函数备注：
*******************************************************************************/
uint8_t gm_lunar_get_month_days(const gm_lunar_t * const p_lunar);

/*******************************************************************************
** 函数名称：gm_lunar_calc_now_days
** 函数作用：计算当前日期在今年的总天数
** 输入参数：p_lunar - 农历日期
** 输出参数：天数
** 使用范例：uint16_t days = gm_lunar_calc_now_days(&lunar);
** 函数备注：
*******************************************************************************/
uint16_t gm_lunar_calc_now_days(const gm_lunar_t * const p_lunar);

/*******************************************************************************
** 函数名称：gm_lunar_check_date_validity
** 函数作用：判断农历日期是否合法
** 输入参数：p_lunar - 农历日期
** 输出参数：是否合法
** 使用范例：bool res = gm_lunar_check_date_validity(&lunar);
** 函数备注：
*******************************************************************************/
bool gm_lunar_check_date_validity(const gm_lunar_t * const p_lunar);

/*******************************************************************************
** 函数名称：gm_calendar_solar_to_lunar
** 函数作用：农历转换，输入日历的年月日，转换为农历
** 输入参数：p_solar - 公历日期
**           p_lunar - 转换后农历日期
** 输出参数：是否成功
** 使用范例：bool res = gm_calendar_solar_to_lunar(&solar, &lunar);
** 函数备注：时间非法或没有农历信息数据会计算失败
*******************************************************************************/
bool gm_calendar_solar_to_lunar(const gm_solar_t * const p_solar, gm_lunar_t * const p_lunar);

/*******************************************************************************
** 函数名称：gm_calendar_lunar_to_solar
** 函数作用：农历到日历转换，输入农历的日期，转换为日历日期
** 输入参数：p_lunar - 农历日期
**           p_solar - 转换后日历日期
** 输出参数：是否成功
** 使用范例：bool res = gm_calendar_lunar_to_solar(&solar, &lunar);
** 函数备注：时间非法或没有农历信息数据会计算失败
*******************************************************************************/
bool gm_calendar_lunar_to_solar(const gm_lunar_t * const p_lunar, gm_solar_t * const p_solar);

#ifdef __cplusplus
}
#endif

#endif  /* GM_CALENDAR_CFG_LUNAR_ENABLE > 0 */

#endif  /* __GM_LUNAR_H__ */
